home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 4 / QRZ Ham Radio Callsign Database - Volume 4.iso / files / dsp / drbubtxt / 56000tar.z / 56000tar / 56000 / adc16 / sxxevb.asm < prev    next >
Assembly Source File  |  1992-04-28  |  4KB  |  119 lines

  1. ;************************************************************
  2. ; file:sxxevb.asm                                           *
  3. ;                                                           *
  4. ; Read DSP56ADC16, correct for sin(x)/x of DAC, and write     *
  5. ; the PCM-56 D/A via the SSI TX register.  This is a        *
  6. ;  polled looping routine.                                  *
  7. ;                                                           *
  8. ;************************************************************
  9.  
  10. ; Written by Charlie Thompson 9/27/88 - Rev 1.0 11/1/88
  11.         
  12.         opt     nomd,nocex,nocm,nomex   
  13.  
  14.         page 132
  15.  
  16.         include '48compeq'      ;FIR filter coefficient file
  17.  
  18. ;  ---------------Constants and memory allocation------------------
  19.  
  20. ntaps   equ     50
  21.  
  22.         org x:0
  23.  
  24. firdata dsm ntaps       ;FIR shift register storage
  25.  
  26.  
  27.  
  28. ;------------------------------------------------------------------
  29.  
  30. ; FIR coefficient macro places the coefficients of the included file
  31. ; in y memory at location 'fircoef'
  32.         
  33.         org y:0
  34.  
  35. fircoef filtcoeff                       ;invoke the coefficient macro
  36.  
  37.  
  38. ; Program start address
  39.  
  40.      org     p:$40
  41.  
  42. ; Set up ADS board in case of force break instead of force reset
  43.  
  44.                 movep #0,x:$FFFE        ;set bcr to zero
  45.                 movec #0,sp             ;init stack pointer
  46.                 movec #0,sr             ;clear loop flag
  47.  
  48. ;       set up register useage for FIR filter 
  49.    
  50.         move    #firdata,r0     ;point to filter data shift register 
  51.         move    #ntaps-1,m0     ;mod(ntaps) 
  52.         move    #fircoef,r4     ;point to filter coefficients 
  53.         move    #ntaps-1,m4     ;mod(ntaps) 
  54.  
  55. ; Set up the SSI to get data from the 
  56. ; The following code sets port C to function as SCI/SSI
  57.  
  58.                 move #$0,a0                     ;zero PCC to cycle it
  59.                 movep a0,x:$FFE1
  60.                 
  61.                 move #$0001ff,a0
  62.                 movep a0,x:$FFE1                ;write PCC
  63.                 
  64. ; The following code sets the SSI CRA and CRB control registers for external
  65. ; continuous clock, synchronous, normal mode.
  66.  
  67.                 move #$004000,a0                ;CRA pattern for word length=16 bits
  68.                 movep a0,x:$FFEC
  69.  
  70.                 move #$003200,a0    ;CRB pattern for continous ck,sych,normal mode
  71.                 movep a0,x:$FFED    ;word long frame sync: FSL=0;ext ck/fs 
  72.  
  73. ; Sample rate is controlled by DSP56ADC16 board.   
  74.  
  75. poll            move #$ffff00,x0        ;mask for zeroing out lower 8 bits              
  76.  
  77. ;**********************************************************************
  78. ; Actual read A/D and write D/A loop  with sin(x)/x compensation FIR  *
  79. ;**********************************************************************
  80.  
  81. ; The following routine reads the DSP56ADC16 and processes samples through
  82. ; a sin(x)/x compensation FIR (for D/A zero order hold correction) and
  83. ; writes the result to the PCM-56 D/A.
  84.  
  85. ; The following code polls the RDF flag in the SSI-SR and waits for RDF=1
  86. ; and then reads the RX register to retrieve the data from the A/D converter.
  87.  
  88.                 jclr #7,x:$FFEE,poll    ;loop until RDF bit = 1
  89.                 movep x:$FFEF,a         ;get A/D converter data
  90.  
  91.                 and x0,a                                ;mask off lower 8 bits of 24 bit word
  92.  
  93.  
  94. ;----------FIR sin(x)/x correction filter routine------------
  95.  
  96. ;This routine provides compensation for sin(x)/x droop of the D/A 
  97. ;zero order hold effects.  The coefficients are set up for 48 KHz 
  98. ;output sampling rate. Therefore the DSP56ADC16 should output data at 48 KHz
  99. ;This filter gives approximately 3dB of boost near Fs/2.
  100.  
  101.         ; FIR filter iteration for one input sample point 
  102.         ; Should leave pointer in correct position in modulo buffer 
  103.  
  104.         move   a1,x0                                    ;move sample to x0
  105.         clr     a    x0,x:(r0)+  y:(r4)+,y0     ;save first sample, get 1st coeff 
  106.         rep     #ntaps-1                                        ;do all but last tap 
  107.         mac     x0,y0,a  x:(r0)+,x0  y:(r4)+,y0  
  108.  
  109.         ; do the last tap based on data from parallel move above 
  110.  
  111.              macr    x0,y0,a  (r0)-             ;back up r0 by one due to post inc 
  112.  
  113.  
  114. ; Write the FIR output to the PCM-56 DAC
  115.  
  116.                 move a,x:$FFEF                  ;write the PCM-56 D/A via SSI xmt reg.
  117.                 jmp poll                                ;loop indefinitely
  118.                 end
  119.